home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 8347 < prev    next >
Encoding:
Internet Message Format  |  1996-08-05  |  2.3 KB

  1. Path: rcp6.elan.af.mil!rscernix!danpop
  2. From: danpop@mail.cern.ch (Dan Pop)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: argc/argv & switches
  5. Date: 29 Feb 96 11:25:42 GMT
  6. Organization: CERN European Lab for Particle Physics
  7. Message-ID: <danpop.825593142@rscernix>
  8. References: <4h2j8j$9gn@milo.freenet.vancouver.bc.ca>
  9. NNTP-Posting-Host: ues5.cern.ch
  10. X-Newsreader: NN version 6.5.0 #7 (NOV)
  11.  
  12. zipz@opus.freenet.vancouver.bc.ca (Patrick Wong) writes:
  13.  
  14. >I would like to know the difference between *++argv[0] and (*++argv)[0].
  15.  
  16. This is a good exercise for someone trying to master complex C expressions
  17. but I strongly recommend against using such constructs in real code.
  18.  
  19. *++argv[0] is equivalent to *(++(argv[0])), which means that argv[0] is
  20. incremented to point to the second character of the first program argument,
  21. then dereferenced, so the result of the expression is that character.
  22.  
  23. (*++argv)[0] is equivalent to (*(++argv))[0], which means that argv is
  24. incremented to point to the second element of the argument array, then
  25. dereferenced by '*', to obtain a pointer to the second program argument,
  26. then dereferenced again (by [0]), to obtain the first character of the 
  27. second program argument.
  28.  
  29. So, if the program was invoked as
  30.  
  31. myprog foo
  32.  
  33. and argv[0] is "myprog" and argv[1] is "foo" (this statement is slightly
  34. inaccurate, argv[0] and argv[1] not being arrays, but pointers to the
  35. first character in an array), *++argv[0] will give 'y' (and argv[0] will
  36. be incremented) while (*++argv)[0] will give 'f' (and argv will be
  37. incremented).
  38.  
  39. Note that *++argv[0] is technically incorrect, because there is no
  40. guarantee that argv[0] can be modified by the program, it can be legally
  41. stored in a read only memory segment.
  42.  
  43. The table at page 53 of K&R2 will help understanding how these expressions
  44. are parsed.
  45.  
  46. >Also, I've seen a lot of programs that have command-line switches like:
  47. >
  48. >view -r -x list.txt
  49. >view -rx list.txt
  50. >view -xr list.txt
  51. >
  52. >How can I write the view program so that it can accept all three formats?
  53.  
  54. On a Unix platform, try "man 3 getopt", otherwise you can find a getopt
  55. implementation with archie or from the book "Obfuscated C And Other
  56. Misteries", by Don Libes.
  57.  
  58. Dan
  59. --
  60. Dan Pop
  61. CERN, CN Division
  62. Email: danpop@mail.cern.ch 
  63. Mail:  CERN - PPE, Bat. 31 R-004, CH-1211 Geneve 23, Switzerland
  64.